 
/* 
 * Copyright (C) Ignacio Lucas
 */
 
/*
 *  user_pool, hecho por Ignacio Lucas.
 *  Reutilizando el esquema de identificadores para los pools, se traduce el nombre del pool a un id y se pasa la tarea al common_object_pools.
 *
 *  Ignacio Lucas <ignacio.lucas@gmail.com>
 *
 */
#include "common.h"
#include "user_pools.h"

typedef struct s_user_pools
{
	hashmap_t poolmap;
	
} user_pools;

static user_pools up;

// indica la cantidad total de pools de objetos.
int user_pools_get_pool_count()
{
	return hashmap_keys_count(up.poolmap);
}

// inicialización del vector de object_pool. En el map se trae la traduccion de los name
// de los user pools a su id correspondiente.
int user_pools_init(hashmap_t map)
{
	up.poolmap=map;
	return 0;
}

static inline int user_pools_check_range(const char *pool_type)
{
	/** Verificamos si el id asociado al pool_type esta dentro de lo esperado. **/
	ssize_t idsize;
	char *strid;
	int id;

	idsize = hashmap_entry_by_key(up.poolmap, pool_type, (void **)&strid);
	if (idsize > 0)
	{
		id=strtol(strid,NULL,10);
		if (id >= 0)
		{
			return id;
		}
	}
	return -1;
}

// devolver un objeto al pool.
int user_pools_put(const char *pool_type, void *p)
{
	int id = user_pools_check_range(pool_type);
	if (id != -1)
	{
		return common_objects_pool_put(id+BASE_USER_POOLS,p);
	}
	return -1;
}

// pedir un objeto del pool.
void* user_pools_get(const char *pool_type)
{
	int id = user_pools_check_range(pool_type);
	if (id != -1)
	{
		return common_objects_pool_get(id+BASE_USER_POOLS);
	}
	return NULL;	
}

int user_pools_destroy()
{
	hashmap_delete(up.poolmap);
	return 0;
}

